from typing import List, Dict

class PromptTemplate:
    """提示词模板"""
    
    @staticmethod
    def get_lab_report_prompt(text_regions: List[Dict]) -> str:
        """检验报告提示词"""
        # 格式化OCR结果，按行组织
        texts = []
        current_y = None
        line_texts = []
        
        # 按Y坐标分组显示，突出双栏布局
        for r in sorted(text_regions, key=lambda x: (x['center_y'], x['center_x'])):
            if current_y is None or abs(r['center_y'] - current_y) > 15:
                if line_texts:
                    texts.append(" | ".join(line_texts))
                line_texts = []
                current_y = r['center_y']
            line_texts.append(f"{r['text']}({r['center_x']:.0f},{r['center_y']:.0f})")
        if line_texts:
            texts.append(" | ".join(line_texts))
        
        prompt = (
            "你是一位专业的医学检验报告分析专家。请仔细分析这份检验报告的所有内容，注意以下关键点：\n\n"
            "报告结构分析：\n"
            "1. 报告头部通常包含患者基本信息、样本信息\n"
            "2. 主体部分是检验项目结果，可能采用单栏或双栏布局\n"
            "3. 报告底部包含时间信息和医师信息\n\n"
            
            "信息提取要求：\n"
            "1. 患者信息：确保提取所有可见的姓名、性别、年龄、科室信息\n"
            "2. 样本信息：标注样本类型、采集时间、接收时间等\n"
            "3. 检验项目：\n"
            "   - 准确匹配项目名称与对应的结果值\n"
            "   - 注意单位和参考范围的对应关系\n"
            "   - 标识结果是否异常（偏高、偏低、正常）\n"
            "   - 确保不遗漏任何一个检验项目\n"
            "4. 医师信息：包括检验医师、审核医师等角色信息\n"
            "5. 时间信息：记录采样、报告等各个时间节点\n\n"
            
            "时空关系分析：\n"
            "1. 同一行（y坐标接近）的文本通常具有关联性\n"
            "2. 对双栏布局特别注意：\n"
            "   - 左侧栏通常是项目名称\n"
            "   - 右侧栏包含结果、单位和参考范围\n"
            "   - 需要正确匹配左右栏的对应关系\n"
            "3. 坐标信息提示：(x,y)表示文本位置，| 分隔同一行的不同文本\n\n"
            
            "请按以下JSON格式输出分析结果：\n"
            "{\n"
            '  "报告类型": "检验报告类型",\n'
            '  "患者信息": {\n'
            '    "姓名":"",\n'
            '    "性别":"",\n'
            '    "年龄":"",\n'
            '    "送检科室":"",\n'
            '    "样本类型":""\n'
            '  },\n'
            '  "检验项目": [\n'
            '    {\n'
            '      "名称":"",\n'
            '      "结果":"",\n'
            '      "单位":"",\n'
            '      "参考范围":"",\n'
            '      "标识":"正常/偏高/偏低"\n'
            '    }\n'
            '  ],\n'
            '  "时间信息": {\n'
            '    "采样时间":"",\n'
            '    "接收时间":"",\n'
            '    "报告时间":""\n'
            '  },\n'
            '  "医师信息": {\n'
            '    "采样人":"",\n'
            '    "检验医师":"",\n'
            '    "审核医师":""\n'
            '  }\n'
            '}\n\n'
            "OCR识别的文本内容（按行组织，包含位置信息）：\n" 
            + "\n".join(texts)
        )
        return prompt

    @staticmethod
    def get_exam_report_prompt(text_regions: List[Dict]) -> str:
        """检查报告提示词"""
        # 格式化OCR结果
        texts = [
            f"[文本:{r['text']} 位置:{r['position']} 置信度:{r['confidence']:.3f}]"
            for r in text_regions
        ]
        
        prompt = (
            "你是一位专业的医学影像报告分析专家。请校验和分析以下检查报告OCR文本，提取关键信息并以JSON格式输出："
            "{"
            '"报告名称":"检查报告名称",'
            '"报告类型":"检查报告类型",'
            '"患者信息":{'
            '"姓名":"","性别":"","年龄":"","科室":""'
            '},'
            '"检查信息":{'
            '"检查项目":"","检查部位":"","检查所见":"","检查诊断":"","检查建议":""'
            '},'
            '"检查时间":"","报告时间":"","报告医师":"","审核医师":""'
            '}\n'
            "OCR识别的文本内容："
            + " ".join(texts)
        )
        return prompt
